package com.athuawei.threadpool;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 线程池：一种线程使用模式，降低资源读消耗；提高响应速度；提高线程读可管理性；
 * 连接池：预先创建好连接，减少每次创建和关闭连接读消耗。
 *
 * 通过Executor框架实现的，
 * Executors（工具类）
 * 1. 一池n线程：Executors.newFixedThreadPool(int)
 * 线程可以重复使用，在显示关闭之前，都将一直存在；代替cpu对线程进行调度管理
 * 2.Executors.newSingleThreadExecutor() 一个任务一个任务执行，一池一线程
 * 3.Executors.newCachedThreadPool(): 线程池根据需求创建线程，可扩容，遇强者强
 *
 * ==== ThreadPoolExecutor: 7个参数
 * int corePoolSize: 常驻线程数量（核心）2
 * int maximumPoolSize: 最大线程数量 5
 * keepAliveTime: 线程存活时间（超过常驻线程数量的线程存活时间）
 * workQueue: 阻塞队列 3
 * threadFactory: 线程工厂，
 * handler: 拒绝策略
 * 常驻线程->阻塞队列->开启最大线程->拒绝
 * 拒绝策略：
 *  1、AbortPolicy 直接抛出异常，阻塞系统
 *  2. CallerRunsPolicy 回退调用者
 *  3. DiscardOldestPolicy 抛弃等待最久任务～
 *  4.DiscardPolicy 不做任何处理
 */
public class ThreadPoolDemo1 {

    public static void main(String[] args) {

        // 一池一线程
        ExecutorService threadPool2 = Executors.newSingleThreadExecutor();

        //一池5线程
        ExecutorService threadPool1 = Executors.newFixedThreadPool(5);

        //一池可扩容线程
        ExecutorService threadPool3 = Executors.newCachedThreadPool();

        //10个任务
        try {
            for(int  i = 1; i <= 20; i++) {
                //执行
                threadPool3.execute(()->{
                    System.out.println(Thread.currentThread().getName() + " 办理业务");
                });
            }
        } catch(Exception e) {
            e.printStackTrace();
        } finally {
            threadPool3.shutdown();
        }


    }
}
